/**
 * @file     :main_window.h
 * @brief    :主窗口类头文件
 * @details  :包含主窗口的定义和相关槽函数
 * @author   :TangMJ
 * @date     :2024-09-17
 */

#ifndef _MAIN_WINDOW_H_
#define _MAIN_WINDOW_H_

#include "generate_file.h"
#include "ui_main_window.h"

class main_window : public QMainWindow {
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     *
     * 初始化主窗口，设置界面和相关属性。
     *
     * @param parent 父窗口指针（默认为 nullptr）
     */
    explicit main_window(QWidget* parent = nullptr);

    /**
     * @brief 析构函数
     *
     * 释放主窗口的资源。
     */
    ~main_window() override;

public slots:
    /**
     * @brief 选择模板文件按钮槽函数
     *
     * 处理选择模板文件按钮点击事件，打开文件对话框以选择模板文件。
     */
    void on_choose_model_file_btn_clicked();

    /**
     * @brief 选择生成路径按钮槽函数
     *
     * 处理选择生成路径按钮点击事件，打开目录选择对话框以选择生成文件夹。
     */
    void on_choose_generation_dir_btn_clicked();

    /**
     * @brief 选择数据文件按钮槽函数
     *
     * 处理选择数据文件按钮点击事件，打开文件对话框以选择数据文件。
     */
    void on_choose_data_file_btn_clicked();

    /**
     * @brief 开始生成按钮槽函数
     *
     * 处理开始生成按钮点击事件，发出信号以启动文件生成过程。
     */
    void on_start_btn_clicked();

private:
    /**
     * @brief 初始化界面
     *
     * 初始化主窗口的界面，包括控件的创建、布局、属性设置等。
     *
     */
    void init_ui();

    /**
     * @brief 初始化信号连接
     *
     * 连接各个控件的信号与槽函数。
     */
    void init_connect();

signals:
    /**
     * @brief 开始生成文件信号
     *
     * 当用户点击开始生成按钮时发出该信号，并传递模板文件、
     * 数据文件及生成目录路径。
     *
     * @param model_file 模板文件路径
     * @param data_file 数据文件路径
     * @param gen_dir 生成目录
     */
    void start_generate_file(const QString model_file, const QString data_file, const QString gen_dir);

    /**
     * @brief 重新生成文件信号
     *
     * 根据提供的模型文件路径、数据文件路径和生成目录，重新生成文件。
     * 如果设置了忽略标志（`is_ignore` 为 `true`），则继续生成文件，忽略未解决的错题号。
     * 如果未设置忽略标志（`is_ignore` 为 `false`），则生成失败并发送失败消息。
     *
     * @param model_file 模型文件的路径
     * @param data_file 数据文件的路径
     * @param gen_dir 生成文件的目录
     * @param is_ignore 是否忽略未解决的错题号
     */
    void start_re_generate_file(const QString model_file, const QString data_file, const QString gen_dir, bool is_ignore);

private:
    Ui::main_window* ui;      ///< 用户界面指针
    QThread* _gen_thread;     ///< 线程指针
    generate_file* _working;  ///< 文件生成器指针
};

#endif
